# VK Messenger

Произведен анализ упаковки программного изделия "VK Messenger" в RPM.

## Объект тестирования

* имя файла: `vk-messenger-6.0.9-build.309-x86_64.rpm`
* хеш MD5: `a9c58efb53b77fef1b32205c09cf2528`

## Анализ пакета

### Скриптлеты пакеты

#### При обновлении пакета удалится симлинк "/usr/bin/vk messenger"

В пакете следующие скриптлеты:

```
$ rpm -q vk-messenger-6.0.9-build.309-x86_64.rpm --scripts
postinstall scriptlet (using /bin/sh):
#!/bin/bash

# Link to the binary
ln -sf '/opt/VK Мессенджер/vk messenger' '/usr/bin/vk messenger'

# SUID chrome-sandbox for Electron 5+
chmod 4755 '/opt/VK Мессенджер/chrome-sandbox' || true

update-mime-database /usr/share/mime || true
update-desktop-database /usr/share/applications || true
postuninstall scriptlet (using /bin/sh):
#!/bin/bash

# Delete the link to the binary
rm -f '/usr/bin/vk messenger'

```

postinstall выполняется после установки пакета, а postuninstall после удаления пакета. При обновлении пакета в одной транзакции ставится новый пакет и удаляется старый. Сначала будет выполнен `%post` нового пакета (будет создан симлинк `/usr/bin/vk messenger`), а затем будет выполнен `%postun` старого пакета (симлинк будет удален). Первым аргументом скриптлету приходит количество пакетов, остающихся после транзакции, что позволяет определить, обновление это или полное удаление. Подробно описано здесь: [https://docs.fedoraproject.org/en-US/packaging-guidelines/Scriptlets/](https://docs.fedoraproject.org/en-US/packaging-guidelines/Scriptlets/). Обратите внимание на раздел "Ordering".

Нет необходимости создавать симлинк скриптом, его можно добавить прямо в RPM. Пример для секции `%install` спека:

```
%install
<...>
ln -sf '/opt/VK Мессенджер/vk messenger' '/usr/bin/vk messenger'
```

А в `%files` добавить просто `/usr/bin/vk messenger`.

Однако при установке такого пакета поверх старой версии все равно сработает `%postun` старой версии и удалит симлинк, созданный в процессе установки предыдущей версии пакета. Объехать это можно, прописав в новой версии, где симлинк уже входит в файлы пакета, так:

```
%triggerpostun -- %{name} < новая_версия
if ! test -e "/usr/bin/vk messenger"; then
	ln -s "/opt/VK Мессенджер/vk messenger" "/usr/bin/vk messenger"
fi
```

Было бы неплохо избежать пробелов в путях хотя бы в `/usr/bin`.

#### Изменение режима доступа к файлу в обход пакетного менеджера

Устанавливать SUID на `/opt/VK Мессенджер/chrome-sandbox` скриптом можно, но не стоит. Поставить права 4755 можно внутри секции `%install` спека и/или исползуя `%attr` в `%files`:

`%attr(4755,-,-) "/opt/VK Мессенджер/chrome-sandbox"`

В rpm существует функционл проверки целостности пакета (`rpm -V`), он будет выдавать, что права на файл не целостны, если менять их скриптом.

Для deb-пакета придется оставить скрипт.

#### Излишние команды в скриптлете

В пакете есть файл `/usr/share/applications/*.desktop`, вызывать `update-desktop-database /usr/share/applications` действительно нужно, однако пакетная система каждого RPM-дистрибутива уже делает это самостоятельно, при чем не только при установке пакета, но и при его удалении.

Это реализуется с помощью файловых триггеров. Примеры:

0. в MOS 12 / ROSA Fresh/Chrome:
	0. [https://abf.io/import/desktop-file-utils/blob/7cd08b7a71/desktop-file-utils.spec#lc-38](https://abf.io/import/desktop-file-utils/blob/7cd08b7a71/desktop-file-utils.spec#lc-38)
	0. [https://abf.io/import/shared-mime-info/blob/d4087491b6/shared-mime-info.spec#lc-72](https://abf.io/import/shared-mime-info/blob/d4087491b6/shared-mime-info.spec#lc-72)
0. в ALT Linux / МОС 10:
	0. [https://packages.altlinux.org/ru/sisyphus/srpms/desktop-file-utils/specfiles/#line-73](https://packages.altlinux.org/ru/sisyphus/srpms/desktop-file-utils/specfiles/#line-73)
	0. [https://packages.altlinux.org/ru/sisyphus/srpms/shared-mime-info/specfiles/](https://packages.altlinux.org/ru/sisyphus/srpms/shared-mime-info/specfiles/) (см. filetrigger)

Файлов, из-за которых было бы необходимо вызывать `update-mime-database`, в пакете нет. Рекомендую убрать вызовы и `update-mime-database`, и `update-desktop-database`, пакетные системы дистрибутивы сделают это сами, когда нужно.

Обратите внимание, что в deb-пакетах нужные скриптлеты могут добавляться в пакет автоматически при его сборке.

### Содержимое пакета

#### Ничейные каталоги

Корень директории `/opt/VK Мессенджер/vk messenger` не принадлежит пакету. Если его установить и выполнить команду `rpm -qf "/opt/VK Мессенджер"`, то будет написано, что каталог ничейный. То же самое касается других каталогов. Пропишите в `%files`:

```
%dir "/opt/VK Мессенджер"
%dir "/opt/VK Мессенджер/locales"
%dir "/opt/VK Мессенджер/resources"
%dir "/opt/VK Мессенджер/swiftshader"
```
